/*
 * adc.c
 *
 * Created: 26.03.2012 17:17:46
 *  Author: KZM
 */ 
#include "adc.h"


#define BAT_SHUNT_MOHM 10 

void adc_init( void )
{
	unsigned int result;

	ADMUX |= ( (0<<REFS1) | (1<<REFS0) ); //VREF=5.0V
	ADMUX |= ( (0<<ADLAR) );	//Left Adjust Result 
	ADCSRA |= ( (1<<ADEN) );	//ADC Enable
	ADCSRA |= ( (0<<ADSC) );	//Start Conversion
	ADCSRA |= ( (0<<ADATE) );	//ADC Auto Trigger Enable
	ADCSRA |= ( (0<<ADIF) );	//ADC Interrupt Flag
	ADCSRA |= ( (0<<ADIE) );	//ADC Interrupt Enable
	ADCSRA |= ( (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) ); // Prescaler: 2^0b111
    ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
    while ( ADCSRA & (1<<ADSC) );      // auf Abschluss der Konvertierung warten

    result = ADCW;  // ADCW muss einmal gelesen werden,
}

int GetBatteryCurrentmA(void){
	int16_t result=0, i, temp;
	
	ADMUX = ( (0<<REFS1) | (1<<REFS0) ); //VREF=5.0V
	ADMUX |= 0x9; // diff ch.0 and ch.1 gain 10x	
	ADMUX |= ( (0<<ADLAR) );	//Left Adjust Result 
	for(i=0;i<2;i++){
		
		ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
		while ( ADCSRA & (1<<ADSC) );      // auf Abschluss der Konvertierung warten
		temp = (ADCW<<6);
		temp >>= 6;
		result += temp;
	}
	result /=2;		
	result = (result/1024.0)*50.0; //mV
	return ((result/BAT_SHUNT_MOHM));
}
int ReadAdcChannel(uint8_t Channel){
	int i=0, avg=0;
	ADMUX = Channel;
	ADMUX |= ( (0<<REFS1) | (1<<REFS0) ); //VREF=5.0V
	ADMUX |= ( (0<<ADLAR) );			//Left Adjust Result 
	for (i=0;i<2;i++){
		ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
		while ( ADCSRA & (1<<ADSC) );      // auf Abschluss der Konvertierung warten
		avg += ADCW;
	}
     // auf Abschluss der Konvertierung warten
	return (avg/2);	
}
#define R1 8200
#define R2 1200
int GetBatteryVoltagemV(void){
	return(ReadAdcChannel(0x3)*(R1+R2)/R2);
}

int GetMotor1CurrentmA(void){
	int result;
	result = (ReadAdcChannel(0x5) * 48.828125) - 25000;
	return (result);	
}

int GetMotor2CurrentmA(void){
	int result;
	result = (ReadAdcChannel(0x6) * 48.828125) - 25000;
	return (result);
}
	
int GetThrottle(void){
	int result;
	result=ReadAdcChannel(0x7);
	result -= 100;
	if (result < 0)
		result=0;
	result *= 1.11;
	if (result > 1023)
		result=1023;
	return (result);
}